Type Erasure হল একটি প্রক্রিয়া যা জাভা কম্পাইলার Generics-এর সাথে কাজ করার সময় ব্যবহার করে। Generics টাইপ প্যারামিটারগুলো compile-time এ চেক করা হয় এবং তারপর runtime এ Generics-এর তথ্য মুছে (erase) ফেলা হয়। এর ফলে জাভার JVM runtime এ Generics সম্পর্কে কোনো তথ্য সংরক্ষণ করে না।
কিভাবে Type Erasure কাজ করে?
Java-এর Generics backward compatibility নিশ্চিত করার জন্য Type Erasure ব্যবহার করে। Generics যোগ করার পরেও পুরনো কোড (pre-Java 5) এবং নতুন কোড একসাথে কাজ করতে পারে।
Type Erasure কাজ করে নিচের ধাপে:
- Compile-time এ টাইপ চেকিং নিশ্চিত করা:
Generics টাইপ প্যারামিটার compile-time এ চেক করা হয়, যাতে টাইপ সেফটি বজায় থাকে। - Runtime এ Generics মুছে ফেলা:
Compile-time এ Generics-এর সমস্ত টাইপ প্যারামিটার তাদের উপযুক্ত বাউন্ড (যদি নির্দিষ্ট করা হয়) বাObject-এ প্রতিস্থাপন করা হয়।
Type Erasure উদাহরণ
Generics Class Example
public class GenericClass<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
// Usage:
GenericClass<String> obj = new GenericClass<>();
obj.setValue("Hello");
System.out.println(obj.getValue());
Type Erasure এর পরে:
public class GenericClass {
private Object value;
public void setValue(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
}
Generics Method Example
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
// Usage:
String[] stringArray = {"A", "B", "C"};
printArray(stringArray);
Type Erasure এর পরে:
public static void printArray(Object[] array) {
for (Object element : array) {
System.out.println(element);
}
}
Bounded Type Parameters এবং Type Erasure
Generics-এ যদি বাউন্ড নির্ধারণ করা হয় (যেমন T extends Number), তবে টাইপ প্যারামিটারটি তার বাউন্ডের ক্লাস বা ইন্টারফেস-এ প্রতিস্থাপিত হয়।
উদাহরণ:
public class BoundedClass<T extends Number> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
Type Erasure এর পরে:
public class BoundedClass {
private Number value;
public void setValue(Number value) {
this.value = value;
}
public Number getValue() {
return value;
}
}
Type Erasure এর সুবিধা
- Backward Compatibility:
Type Erasure এর ফলে Generics-এর আগে তৈরি কোডের সাথে নতুন Generics কোড একসাথে কাজ করতে পারে। - Runtime Efficiency:
Runtime-এ টাইপ সংক্রান্ত অতিরিক্ত মেটাডেটা সংরক্ষণ না করার ফলে JVM-এ কার্যকারিতা বজায় থাকে।
Type Erasure এর সীমাবদ্ধতা
Runtime এ Generics টাইপ ইনফরমেশন অনুপস্থিত:
Compile-time টাইপ চেকিং সম্ভব হলেও runtime এ Generics টাইপ ইনফরমেশন মুছে যায়। ফলে নিচের সমস্যাগুলো দেখা দিতে পারে:List<String> stringList = new ArrayList<>(); List<Integer> intList = new ArrayList<>(); System.out.println(stringList.getClass() == intList.getClass()); // trueউপরের উদাহরণে, Generics টাইপ ইনফরমেশন runtime-এ অনুপস্থিত হওয়ায় উভয় লিস্ট একই
Classহিসেবে বিবেচিত হয়।- Type Casting প্রয়োজন:
Runtime এ টাইপ ইনফরমেশন মুছে ফেলার কারণে Object থেকে নির্দিষ্ট টাইপে কাস্টিং করতে হয়। Array of Generics:
Generics এর কারণে array creation করতে সমস্যা হয়, কারণ runtime এ টাইপ ইনফরমেশন সংরক্ষিত থাকে না।List<String>[] array = new ArrayList<String>[10]; // Compile-time ErrorOverloaded Method Resolution:
Generics ব্যবহার করলে Overloaded মেথডের সমস্যা হতে পারে:public void method(List<String> list) { } public void method(List<Integer> list) { }উপরের কোড runtime এ একই মেথডে রূপান্তরিত হয় এবং কম্পাইল-টাইম এ এরর দেয়।
Type Erasure এ Annotation ব্যবহার
Annotations যেমন @SuppressWarnings("unchecked") ব্যবহার করা হয় Generics সম্পর্কিত warnings থেকে মুক্তি পেতে।
@SuppressWarnings("unchecked")
public void method() {
List<String> list = (List<String>) new ArrayList(); // Unchecked cast
}
- Type Erasure Generics এর মাধ্যমে compile-time টাইপ সেফটি নিশ্চিত করে, তবে runtime এ Generics টাইপ ইনফরমেশন মুছে ফেলে।
- এটি backward compatibility বজায় রাখার জন্য অপরিহার্য, তবে runtime টাইপ ইনফরমেশন না থাকার কারণে কিছু সীমাবদ্ধতা তৈরি হয়।
- এর সুবিধা এবং সীমাবদ্ধতাগুলি বোঝার মাধ্যমে Generics আরও কার্যকরভাবে ব্যবহার করা যায়।
Read more